In computer science, a virtual machine (VM) is a portion of software that, when executed on appropriate hardware, creates an environment allowing the virtualization of an actual physical computer system. Each VM may function as a self-contained platform, running its own operating system (OS) and software applications (processes). Typically, a virtual machine monitor (VMM) manages allocation and virtualization of computer resources and performs context switching, as may be necessary, to cycle between various VMs.
A host machine (e.g., computer or server) is typically enabled to simultaneously run multiple VMs, where each VM may be used by a local or remote client. The host machine allocates a certain amount of the host's resources to each of the VMs. Each VM is then able to use the allocated resources to execute guest software, including operating systems known as guest operating systems. The VMM virtualizes the underlying hardware of the host machine or emulates hardware devices, making the use of the VM transparent to the guest operating system or the remote client that uses the VM.
Most operating systems are not optimized for use in a virtual machine. This lack of optimization manifests itself, among other instances, when the virtual machine provides images to a display at a remote client. Because operating systems typically send images to a local display via a low latency high bandwidth path, little attention is paid to repeated images sent to the display. However, when a remote display system (RDS) sends multiple identical images to a remote display of a client, considerable slowdown can occur, as well as an increase in bandwidth usage.
An example of an operating system that is not optimized for use in a virtual machine is the Windows® operating system manufactured by Microsoft®, Inc. The Windows operating system uses a graphics device interface (GDI) to generate images for a display, printer, plotter or bitmap file in memory. Each image is assigned to a particular surface, and is given a unique image identifier within that surface. Ideally, the same image would always have the same surface ID and image ID. However, this is not the case. The GDI frequently assigns different image IDs and/or surface IDs to identical images or does not assign image IDs or surface IDs at all. This behavior results in multiple redundant images being sent to the client, consuming unnecessary resources. Therefore, the GDI mechanism cannot be relied upon to identify whether a current image matches any previously transmitted images.
Some operating systems include a feature that recommends whether or not to cache image objects. However, the accuracy of this feature may not be reliable. For example, the GDI of Windows often suggests that an image be cached, even though the image is never encountered again and may waste a considerable amount of cache space. Likewise, the GDI also suggests that image objects should not be cached for image objects that will be repeated hundreds or thousands of times. Therefore, the GDI mechanism also cannot be relied upon for making image caching decisions.